package tommy.dev.onepieceproject;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import com.polites.android.GestureImageView;

import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;


	public class DrawableManager {
	    private final Map<String, Drawable> drawableMap;

	    public DrawableManager() {
	        drawableMap = new HashMap<String, Drawable>();
	    }

	    public Drawable fetchDrawable(String urlString) {
	        if (drawableMap.containsKey(urlString)) {
	            return drawableMap.get(urlString);
	        }

	        Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
	        try {
	            InputStream is = fetch(urlString);
	            Drawable drawable = Drawable.createFromStream(is, "src");


	            if (drawable != null) {
	                drawableMap.put(urlString, drawable);
	                Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
	                        + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
	                        + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
	            } else {
	              Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
	            }

	            return drawable;
	        } catch (MalformedURLException e) {
	            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
	            return null;
	        } catch (IOException e) {
	            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
	            return null;
	        }
	    }

	    public void fetchDrawableOnThread(final String urlString, final GestureImageView imageView) {
	        if (drawableMap.containsKey(urlString)) {
	            imageView.setImageDrawable(drawableMap.get(urlString));
	        }

	        final Handler handler = new Handler() {
	            @Override
	            public void handleMessage(Message message) {
	                imageView.setImageDrawable((Drawable) message.obj);
	            }
	        };

	        Thread thread = new Thread() {
	            @Override
	            public void run() {
	            	//imageView.setImageResource(R.drawable.ficon);
	                //TODO : set imageView to a "pending" image
	                Drawable drawable = fetchDrawable(urlString);
	                Message message = handler.obtainMessage(1, drawable);
	                handler.sendMessage(message);
	            }
	        };
	        thread.start();
	    }

	    private InputStream fetch(String urlString) throws MalformedURLException, IOException {
	        DefaultHttpClient httpClient = new DefaultHttpClient();
	        HttpGet request = new HttpGet(urlString);
	        HttpResponse response = httpClient.execute(request);
	        return response.getEntity().getContent();
	    }
	}

